package com.rocky.component.elasticsearch.config.property;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Collections;
import java.util.List;

/**
 * @author rocky
 * date 2025-07-16
 * Description:
 */
@Data
@ConfigurationProperties(prefix = "rocky.elasticsearch")
public class RockyElasticsearchProperty {

    private List<String> host = Collections.singletonList("127.0.0.1:9200");

    private String username;

    private String password;

    /**
     * 建立连接后，等待 Elasticsearch 节点响应数据的最大时间。如果在这个时间内没有收到响应，请求将会失败
     */
    private Integer socketTimeout = 30000;

    /**
     * 尝试与 Elasticsearch 节点建立连接的最大等待时间。如果在这个时间内无法建立连接，连接操作将会失败
     */
    private Integer connectTimeout = 1000;

    /**
     * 从连接池获取连接的最大等待时间。当连接池中的连接都被占用时，客户端等待获取可用连接的最长时间
     */
    private Integer connectionRequestTimeout = 1000;

    /**
     * 整个连接池允许的最大连接数。当你有多个线程或者多个请求需要与 Elasticsearch 交互时，这个参数可以限制并发连接的总数，避免资源过度占用
     */
    private Integer maxConnectTotal = 30;

    /**
     * 每个路由（可以理解为每个 Elasticsearch 节点）允许的最大连接数。因为可能会有多个 Elasticsearch 节点组成集群，这个参数可以控制对每个节点的并发连接数
     */
    private Integer maxConnectPerRoute = 10;

    /**
     * 连接保持策略，决定了这个连接是否应该保持打开，以及保持打开的时长。如果后续有新的请求，就可以直接复用这个保持打开的连接，避免了重新建立连接的时间和资源消耗
     */
    private Long keepAliveStrategy = -1L;

    private String basePackage = "com.rocky.component";

    private RockyElasticsearchProperty.IndexProperty index = new IndexProperty();

    @Data
    public static class IndexProperty {

        /**
         * 全局索引前缀，RockyESModel中设置索引前缀时，该配置将会失效
         */
        private String indexPrefixName = "rocky_";

        /**
         * 主分片数量
         */
        private Integer numberOfShards = 1;

        /**
         * 副本分片数量
         */
        private Integer numberOfReplicas = 1;
    }
}
